home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / xmris / xmris.h < prev    next >
C/C++ Source or Header  |  1995-06-06  |  22KB  |  651 lines

  1. /*{{{  (C) 1992 Nathan Sidwell*/
  2. /*****************************************************************************
  3.             X M R I S V1.01
  4.             ---------------
  5.             (C) 1992 Nathan Sidwell
  6.  
  7. This program is copyright (C) 1992 Nathan Sidwell. This software and documentation
  8. is in the public domain. Permission is granted to distribute and compile
  9. verbatim copies of this software for non-commercial, non-profit use,
  10. without fee. The software may be modified, provided that both the above copyright
  11. notice and this permission notice appear.
  12.  
  13. No guarantee is given as to the robustness or suitability of this
  14. software for your computer.
  15.  
  16. Nathan Sidwell  INMOS UK |                 | nathan@inmos.co.uk       DoD#0390
  17. *****************************************************************************/
  18. /*}}}*/
  19. #include "patchlevel.h"
  20. #ifndef EXTERN
  21. #define EXTERN extern
  22. #endif
  23. /*{{{  ANSI or K&R?*/
  24. #ifdef __STDC__
  25. #include <stdarg.h>
  26. #define PROTOARGLIST(list) list
  27. #define VARARG
  28. #define FUNCVARARG ... )
  29. #define FUNCARGLIST(list) (
  30. #define FUNCARGSEP ,
  31. #define FUNCARGTERM )
  32. #define FUNCARGVOID ()
  33. #define VARARGSET(args, last) va_start(args, last)
  34. #else /* !__STDC__ */
  35. #include <varargs.h>
  36. #define PROTOARGLIST(list) ()
  37. #define const
  38. #define volatile
  39. #define VARARG , va_alist
  40. #define FUNCVARARG va_dcl
  41. #define FUNCARGLIST(list) list
  42. #define FUNCARGSEP  ;
  43. #define FUNCARGTERM ;
  44. #define FUNCARGVOID ()
  45. #define VARARGSET(args, last) va_start(args)
  46. #ifndef DATE
  47. #define DATE "July 1992"
  48. #endif /* DATE */
  49. #define memmove memcpy /* K&R doesn't have memmove, but memcpy is a superset */
  50. #endif /* __STDC__ */
  51. /*}}}*/
  52. /*{{{  include*/
  53. #include <stddef.h>
  54. #include <stdlib.h>
  55. #include <stdio.h>
  56. #include <assert.h>
  57. #include <string.h>
  58. #include <ctype.h>
  59. #include <X11/Xlib.h>
  60. #include <X11/Xutil.h>
  61. /*}}}*/
  62. /*{{{  defines*/
  63. /*{{{  board sizes*/
  64. #define CELLS_ACROSS  12  /* size of the board */
  65. #define CELLS_DOWN    13
  66. #define CELL_WIDTH    32  /* size of the internal cell */
  67. #define CELL_HEIGHT   32  /* monster sprites must be this size */
  68. #define GAP_WIDTH     4   /* spacing of the cells */
  69. #define GAP_HEIGHT    4
  70. #define PLAYER_START_X  ((CELLS_ACROSS - 1) >> 1)
  71. #define PLAYER_START_Y  (CELLS_DOWN - 1)
  72. #define DEN_X           ((CELLS_ACROSS - 1) >> 1)
  73. #define DEN_Y           (CELLS_DOWN >> 1)
  74. #define CELL_STRIDE   16  /* board array is bigger than the board */
  75. #define CELL_TOP      2   /* and the board is offset by this much */
  76. #define CELL_LEFT     2
  77. #define KNOCK_THROUGH /* how far we go to knock through a new cell */\
  78.     ((CELL_WIDTH + CELL_HEIGHT + GAP_WIDTH + GAP_HEIGHT) / 3)
  79. #define BORDER_TOP    (CELL_HEIGHT + 2) /* placing of the board */
  80. #define BORDER_BOTTOM (CELL_HEIGHT + 2) /* on the window */
  81. #define BORDER_LEFT   2
  82. #define BORDER_RIGHT  2
  83. #define FLOOD_FILL    32  /* how many branches in the distance flood fill */
  84. #define BOARD_WIDTH   ((CELL_WIDTH + GAP_WIDTH) * CELLS_ACROSS + GAP_WIDTH)
  85. #define BOARD_HEIGHT  ((CELL_HEIGHT + GAP_HEIGHT) * CELLS_DOWN + GAP_WIDTH)
  86. #define WINDOW_WIDTH  (BOARD_WIDTH + BORDER_LEFT + BORDER_RIGHT)
  87. #define WINDOW_HEIGHT (BOARD_HEIGHT + BORDER_TOP + BORDER_BOTTOM)
  88. #define XTRA_SPACING  ((CELL_WIDTH * 4 + GAP_WIDTH * 3) / 5)
  89. #define XTRA_X        (BORDER_LEFT + CELL_WIDTH * 4 + GAP_WIDTH * 5)
  90. #define XTRA_Y        (BORDER_TOP - CELL_HEIGHT)
  91. /*}}}*/
  92. /*{{{  frame rate*/
  93. /* these are in uS, if it is too fast, the load line
  94.  * at the bottom will start to grow */
  95. #ifndef FRAME_RATE
  96. #define FRAME_RATE    37000
  97. #endif
  98. #define ZOOM_RATE (FRAME_RATE / 4)
  99. /*}}}*/
  100. /*{{{  font name*/
  101. #ifndef FONT_NAME
  102. #define FONT_NAME "-*-courier-*-r-*-*-18-*-*-*-*-*-*-*"
  103. #endif
  104. /*}}}*/
  105. /*{{{  game gender*/
  106. #ifndef GAME_GENDER
  107. #define GAME_GENDER (random() & 1)
  108. #endif
  109. /*}}}*/
  110. #define START_LIVES     3
  111. /*{{{  velocities*/
  112. #define VEL_X           GAP_WIDTH             /* how far we move per step */
  113. #define VEL_Y           GAP_HEIGHT
  114. #define VEL_X_FAST      (VEL_X * 5 / 4)       /* how far a fast stride is */
  115. #define VEL_Y_FAST      (VEL_Y * 5 / 4)
  116. #define FAST_STEPS      (CELL_WIDTH / VEL_X / 4) /* how many fast strides */
  117. #define APPLE_VEL_Y     (VEL_Y * 3 / 2)       /* how fast the apple falls */
  118. #define APPLE_VEL_X     (VEL_X / 2)           /* how fast it goes sideways */
  119. #define APPLE_ACC       (VEL_Y / 2)
  120. #define BALL_STEPS      2                     /* relative ball speed */
  121. #define BALL_EX         (CELL_WIDTH / 2)      /* how fast we explode */
  122. #define BALL_EY         (CELL_HEIGHT / 2)
  123. #define ZOOM_X          VEL_X                 /* how fast the zoom is */
  124. #define ZOOM_Y          VEL_Y
  125. /*}}}*/
  126. /*{{{  ball stuff*/
  127. #define BALL_EXPLODE    (BOARD_WIDTH / BALL_EX) /* how much we explode */
  128. #define BALL_IMPLODE_PROB 4     /* that the ball returns */
  129. /*}}}*/
  130. #define DIE_DELAY       10  /* ticks for death spiral */
  131. #define SCORE_SHOW      45  /* how long on board scores show */
  132. #define DISPLAY_HOLD    (SCORE_SHOW * 2)
  133. #define HISTORY_SHOW    3   /* how often we show the history */
  134. /*{{{  apple stuff*/
  135. #define APPLE_ROCK_DELAY  8    /* ticks for it to rock */
  136. #define APPLE_SPLIT_DELAY 8    /* ticks for split */
  137. #define APPLE_DECAY_DELAY 8    /* ticks for decay */
  138. #define APPLE_ROT_DELAY   8    /* ticks for rot */
  139. #define APPLE_FALL_SPLIT  (CELL_HEIGHT + GAP_HEIGHT + APPLE_VEL_Y) /* safe fall distance */
  140. /*}}}*/
  141. /*{{{  den escape*/
  142. #define DEN_ESCAPE_PROB   8     /* normal monster gets out of the den */
  143. #define DEN_ESCAPE_DELAY  6     /* how many den flashes before escape */
  144. #define DEN_ESCAPE_FLASH  0x8   /* time per den flash */
  145. /*}}}*/
  146. /*{{{  normal & muncher*/
  147. #define GO_MUNCH_PROB     1     /* difficulty scale that normal goes munchy */
  148. #define DIFFICULTY_PEDESTAL 2   /* offset for difficulty */
  149. #define CONT_TOGGLE_PROB  2     /* continue flag toggle */
  150. #define PUSH_TURN_PROB    64    /* muncher turns around when pushing */
  151. #define GO_MUNCH_DELAY    16    /* pause when we start munching */
  152. #define STOP_MUNCH_DELAY  16    /* pause when we stop munching */
  153. /*}}}*/
  154. /*{{{  xtra & drone*/
  155. #define XTRA_INC_PROB     2     /* next xtra monster is selected */
  156. #define XTRA_BIRTH_DELAY  ((CELL_WIDTH + GAP_WIDTH) / VEL_X + 4)    /* pause while giving birth to drones */
  157. #define XTRA_CONT_OFF_PROB 16   /* that xtra stops continuing */
  158. #define NEXT_XTRA_PROB    1     /* probability that the extra changes */
  159. #define CHOMP_DELAY     (CELL_WIDTH / VEL_X * 6) /* how long to eat an apple */
  160. /*}}}*/
  161. #define MONSTER_CYCLES    6     /* cycle counter */
  162. #define MONSTER_IMAGES    2     /* how many different images */
  163. /*{{{  limits*/
  164. #define INITIAL_APPLES  6
  165. #define APPLES          (INITIAL_APPLES + 4)    /* max number of apples */
  166. #define MONSTERS        ((CELLS_DOWN - 2) * 2)  /* maximum number of monsters */
  167. #define BOARD_SCORES    4   /* number of on board displayed scores */
  168. #define BACK_UPDATES    32  /* background updates we can cope with */
  169. /*}}}*/
  170. /*{{{  colour flags*/
  171. #define COLOUR_ZERO     0   /* colour is all zeros */
  172. #define COLOUR_ONE      1   /* colour is all ones */
  173. #define COLOUR_WEIRD    2   /* colour is neither zeros or ones */
  174. /*}}}*/
  175. /*}}}*/
  176. /*{{{  macros*/
  177. #define PIXELX(CX, OX) \
  178.     ((CX) * (CELL_WIDTH + GAP_WIDTH) + (OX) + GAP_WIDTH + BORDER_LEFT)
  179. #define PIXELY(CY, OY) \
  180.     ((CY) * (CELL_HEIGHT + GAP_HEIGHT) + (OY) + GAP_HEIGHT + BORDER_TOP)
  181. #define BOARDCELL(CX, CY) \
  182.     (&board[(CY) * CELL_STRIDE + (CX) + CELL_LEFT + CELL_TOP * CELL_STRIDE])
  183. /*}}}*/
  184. /*{{{  structs*/
  185. /*{{{  typedef struct Cell*/
  186. typedef struct Cell
  187. /* information about 1 cell on the board */
  188. {
  189.   int     depths[4];      /* depths moved to from cell */
  190.   unsigned  distance;     /* distance from player */
  191.   unsigned  visit    : 1; /* has been visited */
  192.   unsigned  sprite;       /* has a sprite in it (cherry, or center stuff) */
  193. } CELL;
  194. /*}}}*/
  195. /*{{{  typedef struct Coord*/
  196. typedef struct Coord
  197. /* general coordinate store */
  198. {
  199.   int       x;
  200.   int       y;
  201. } COORD;
  202. /*}}}*/
  203. /*{{{  typedef struct Sprite*/
  204. typedef struct Sprite
  205. /* sprite definition */
  206. {
  207.   char *image_bits;           /* image bitmap */
  208.   char *mask_bits;            /* mask bitmap */
  209.   unsigned  width;            /* width of sprite */
  210.   unsigned  height;           /* height of sprite */
  211.   COORD     expected;         /* expected size */
  212.   unsigned  copy;             /* generated from this sprite */
  213.   unsigned  reflect;          /* reflection 1 = v axis, 2 = h axis */
  214.   Pixmap    image;            /* image pixmap */
  215.   Pixmap    mask;             /* mask pixmap */
  216. } SPRITE;
  217. /*}}}*/
  218. /*{{{  typedef struct Arg*/
  219. typedef struct Arg
  220. /* command line argument specifier */
  221. {
  222.   char const *arg;      /* arg text */
  223.   int       flag;       /* switch or value */
  224.   void      *ptr;       /* value pointer */
  225.   char const *help;     /* help message */
  226. } ARG;
  227. /*}}}*/
  228. /*{{{  typedef struct Board*/
  229. typedef struct Board
  230. /* initial board information */
  231. {
  232.   unsigned  fill;   /* fill pattern */
  233.   char      map[CELLS_DOWN][CELLS_ACROSS];
  234. } BOARD;
  235. /*}}}*/
  236. /*{{{  typedef struct Background*/
  237. typedef struct Background
  238. /* area to update from back to copy to window */
  239. {
  240.   COORD   place;  /* top left area */
  241.   COORD   size;   /* size of area */
  242. } BACKGROUND;
  243. /*}}}*/
  244. /*{{{  typedef struct Score*/
  245. typedef struct Score
  246. /* on board score display */
  247. {
  248.   Pixmap    mask;   /* the mask to use */
  249.   Pixmap    image;  /* the image to display */
  250.   COORD     place;  /* where to bung it */
  251.   unsigned  count;  /* removal countdown */
  252. } SCORE;
  253. /*}}}*/
  254. /*{{{  typedef struct Ball*/
  255. typedef struct Ball
  256. /* the ball state */
  257. {
  258.   COORD     cell;
  259.   COORD     offset;
  260.   COORD     pixel;
  261.   unsigned  state;  /* state of the ball
  262.              * 0 held by player
  263.              * 1 bouncing
  264.              * 2 exploding
  265.              * 3 exploded
  266.              * 4 imploding
  267.              */
  268.   unsigned  count;  /* count or direction or player type */
  269.   unsigned  image;  /* player image */
  270. } BALL;
  271. /*}}}*/
  272. /*{{{  typedef struct Apple*/
  273. typedef struct Apple
  274. /* non-background apple information */
  275. {
  276.   COORD     cell;       /* apple's cell */
  277.   COORD     offset;     /* offset from center */
  278.   COORD     pixel;      /* pixel for sprite */
  279.   int       push;       /* horizontal push */
  280.   unsigned  count;      /* general counter */
  281.   unsigned  state;      /* state
  282.              * 0 stationary
  283.              * 1 rock
  284.              * 2 falling
  285.              * 3 split
  286.              * 4 decay
  287.              * 5 rot
  288.              * 6 delete
  289.              */
  290.   unsigned  distance;     /* distance we've fallen */
  291.   unsigned  monsters;     /* monsters we've squashed */
  292.   unsigned  chewed;       /* chewed */
  293.   int       maypush;      /* temp push vector */
  294.   unsigned  waspushed;    /* was pushed the previous go */
  295.   struct Monster *list;   /* list of monsters for initial fall */
  296.   COORD     old_pixel;    /* where i was */
  297.   unsigned  old_state;    /* what I looked like */
  298. } APPLE;
  299. /*}}}*/
  300. /*{{{  typedef struct Apple_Size*/
  301. typedef struct Apple_Size
  302. {
  303.   COORD size;
  304.   COORD offset;
  305. } APPLE_SIZE;
  306. /*}}}*/
  307. /*{{{  typedef struct Text*/
  308. typedef struct Text
  309. /* how we say text sizes */
  310. {
  311.   int       ascent;
  312.   int       descent;
  313.   int       width;
  314. } TEXT;
  315. /*}}}*/
  316. /*{{{  typedef struct Monster*/
  317. typedef struct Monster
  318. /* monster information */
  319. {
  320.   COORD     cell;     /* board cell we're related to */
  321.   COORD     offset;   /* offset from this cell */
  322.   COORD     pixel;    /* pixel coordinate */
  323.   unsigned  dir;      /* direction we're moving in */
  324.   unsigned  pause;    /* we're paused for one */
  325.   unsigned  stop;     /* we're stopped (player only) */
  326.   unsigned  type;     /* type
  327.                * 0 - normal
  328.                * 1 - munch
  329.                * 2 - xtra
  330.                * 3 - drone
  331.                * 4 - player
  332.                * 5 - delete
  333.                *>5 - demo sprite
  334.                */
  335.   unsigned  face;     /* direction we're facing
  336.                * 0 up left,
  337.                * 1 down right
  338.                * 2 left
  339.                * 3 right
  340.                * 4 up right
  341.                * 5 down left
  342.                * 6 push left
  343.                * 7 push right
  344.                * 8 squish left
  345.                * 9 squish right
  346.                */
  347.   int       push;     /* being pushed in this direction */
  348.   unsigned  gomunch;  /* change munch state */
  349.   unsigned  cont;     /* continue */
  350.   unsigned  chew;     /* chewing */
  351.   unsigned  count;    /* counter */
  352.   unsigned  shot;     /* has been shot */
  353.   unsigned  cycle;    /* image cycler */
  354.   unsigned  image;    /* which image to display */
  355.   unsigned  fast;     /* fast speed */
  356.   unsigned  pushing;  /* pushing apple */
  357.   struct Monster *list; /* list of monsters for initial apple fall */
  358.   APPLE     *apple;   /* which apple we're stuck to */
  359.   COORD     old_pixel;  /* where we were */
  360.   int       old_sprite; /* what we looked like */
  361. } MONSTER;
  362. /*}}}*/
  363. /*}}}*/
  364. /*{{{  display*/
  365. EXTERN struct
  366. {
  367.   char const *name;   /* display name */
  368.   Display   *display; /* server name stuff */
  369.   int       screen;   /* it's default screen */
  370.   Colormap  colormap; /* color map for display */
  371.   Window    root;     /* its root window */
  372.   Window    window;   /* game window */
  373.   int       depth;    /* bitplanes */
  374.   unsigned  long black; /* black pixel index */
  375.   unsigned  long white; /* white pixel index */
  376.   unsigned  long xor;   /* black xor white */
  377.   Atom      DEC_icon_atom; /* DEC iconizing hack */
  378.   unsigned  long event_mask; /* default event mask */
  379.   Pixmap    back;     /* background store */
  380.   Pixmap    copy;     /* backing store */
  381.   Cursor    cursor;   /* cursor to use */
  382.   Pixmap    icon;     /* icon to use */
  383.   unsigned  background; /* type of background colour */
  384.   unsigned  foreground; /* type of foreground colour */
  385. } display;
  386. /*}}}*/
  387. /*{{{  font*/
  388. EXTERN struct
  389. {
  390.   char const *name;   /* name of font */
  391.   Font      font;     /* font handle */
  392. } font;
  393. /*}}}*/
  394. EXTERN CELL board[(CELLS_DOWN + CELL_TOP * 2) * CELL_STRIDE];
  395. EXTERN Pixmap ball_xor;
  396. /*{{{  gc*/
  397. #define GCN(n)    gcs[n]
  398. #define GC_COPY   0   /* src */
  399. #define GC_CLEAR  1   /* background */
  400. #define GC_SET    2   /* foreground */
  401. #define GC_MASK   3   /* NOT src AND dst */
  402. #define GC_OR     4   /* src OR dst */
  403. #define GC_BACK   5   /* background cutter */
  404. #define GC_BALL   6   /* XOR for the ball */
  405. #define GC_TEXT   7   /* text drawer */
  406. #define GC_AND    8   /* and */
  407. #define GC_BOARD  9   /* board background */
  408. #define GCS       10
  409. EXTERN GC gcs[GCS];
  410. /*}}}*/
  411. /*{{{  flags*/
  412. EXTERN struct
  413. {
  414.   unsigned  reverse;  /* reverse black & white */
  415.   unsigned  bw;       /* force black & white */
  416.   unsigned  iconic;   /* start iconic */
  417.   unsigned  help;     /* gimme some help */
  418.   unsigned  gender;   /* he or she? */
  419. } flags;
  420. /*}}}*/
  421. /*{{{  player*/
  422. EXTERN struct
  423. /* player specific information
  424.  * note, the playe place info is stored as monster 0
  425.  */
  426. {
  427.   unsigned  screen;     /* current screen number */
  428.   unsigned  score;      /* our score */
  429.   unsigned  lives;      /* lives we have left (including on screen) */
  430.   COORD     mouse;      /* mouse destination square */
  431.   unsigned  throw;      /* throw the ball */
  432.   unsigned  button;     /* throw button state */
  433.   unsigned  mouse_dir;  /* mouse direction */
  434.   unsigned  next_dir;   /* direction at next intersection */
  435.   unsigned  pressed;    /* keys we have pressed */
  436.   unsigned  bashed;     /* we bashed into a wall */
  437.   BALL      old_ball;   /* what was the ball */
  438.   BALL      ball;       /* ball information */
  439.   unsigned  keyboard;   /* use keyboard */
  440.   unsigned  cherry;     /* consecutive cherry count */
  441.   unsigned  distance;   /* distance to next cherry */
  442.   COORD     raw_mouse;  /* the raw mouse input */
  443.   unsigned  old_pressed; /* old keys pressed */
  444.   unsigned  motionevent; /* the mouse moved */
  445. } player;
  446. /*}}}*/
  447. EXTERN unsigned long seed; /* random number seed */
  448. EXTERN char const *game_name; /* name of the game */
  449. /*{{{  global*/
  450. EXTERN struct
  451. {
  452.   unsigned  difficulty;     /* increments in to make it harder */
  453.   unsigned  broken;         /* broken through a new path */
  454.   unsigned  cherries;       /* number of cherries left */
  455.   unsigned  state;          /* den state
  456.                  * 0 - den on screen
  457.                  * 1 - cake on screen
  458.                  * 2 - xtras & drone running around
  459.                  * 3 - done xtras
  460.                  * 4 - end game
  461.                  * 5 - extra life
  462.                  * 6 - demo
  463.                  * 7 - high scores
  464.                  * 8 - history
  465.                  */
  466.   unsigned  missed;         /* missed interrupt count */
  467. } global;
  468. /*}}}*/
  469. /*{{{  extra*/
  470. EXTERN struct
  471. {
  472.   unsigned  got;      /* one we've got */
  473.   unsigned  select;   /* the one which is selected */
  474.   unsigned  escape;   /* its out */
  475.   unsigned  score;    /* last checked score */
  476. } extra;
  477. /*}}}*/
  478. /*{{{  apple*/
  479. EXTERN struct
  480. {
  481.   APPLE     list[APPLES]; /* apple list */
  482.   unsigned  apples;       /* number of apples out */
  483. } apple;
  484. /*}}}*/
  485. /*{{{  history*/
  486. EXTERN struct
  487. {
  488.   unsigned  prize;
  489.   unsigned  ending;
  490. } history;
  491. /*}}}*/
  492. /*{{{  monster*/
  493. EXTERN struct
  494. {
  495.   MONSTER   list[MONSTERS]; /* monsters [0] is player */
  496.   unsigned  monsters;       /* number of monsters out (inc player) */
  497.   unsigned  delay;          /* escape delay */
  498.   unsigned  den;            /* monster spawn count */
  499.   unsigned  normals;        /* normal monsters alive */
  500.   unsigned  drones;         /* drones out */
  501.   unsigned  nearest;        /* what was the nearest distance to player */
  502.   unsigned  farthest;       /* what was the farthest distance to player */
  503. } monster;
  504. /*}}}*/
  505. /*{{{  update*/
  506. EXTERN struct
  507. {
  508.   COORD     tl;       /* top left */
  509.   COORD     br;       /* bottom right */
  510.   unsigned  set;      /* tl & br set */
  511.   struct
  512.   {
  513.     unsigned  backs; /* number of areas to update to window */
  514.     BACKGROUND list[BACK_UPDATES]; /* the area information */
  515.   } back;
  516.   struct
  517.   {
  518.     unsigned  scores;  /* number of displayed scores */
  519.     SCORE     list[BOARD_SCORES];   /* the displayed scores */
  520.   } score;
  521. } update;
  522. /*}}}*/
  523. /*{{{  tables*/
  524. extern ARG const args[];
  525. /*{{{  sprite numbers*/
  526. #define SPRITE_CENTER_BASE     0
  527. #define SPRITE_MUNCH_BASE      2
  528. #define SPRITE_EDGE_BASE       4
  529. #define SPRITE_FILL_BASE       6
  530. #define SPRITE_DIGITS         10
  531. #define SPRITE_CHERRY         11
  532. #define SPRITE_DEN            12
  533. #define SPRITE_BALL           13
  534. #define SPRITE_APPLE          14
  535. #define SPRITE_EXTRA          20
  536. #define SPRITE_XTRA_SOURCE    22
  537. #define SPRITE_MONSTERS       24
  538. #define SPRITE_NORMAL         24
  539. #define SPRITE_MUNCHER        36
  540. #define SPRITE_XTRA           48
  541. #define SPRITE_DRONE          60
  542. #define SPRITE_PLAYER         72
  543. #define SPRITE_PLAYER_PUSH    84
  544. #define SPRITE_PLAYER_DEAD    88
  545. #define SPRITE_SQUISHED       90
  546. #define SPRITE_CHOMP          100
  547. #define SPRITE_MRIS           102
  548. #define SPRITE_PRIZE_BASE     110
  549. #define SPRITES               115
  550. /*}}}*/
  551. #define SPRITE_FILLS           4
  552. #define SPRITE_PRIZES          5
  553. /*{{{  random sizes*/
  554. #define MUNCH_WIDTH     (VEL_X * 4) 
  555. #define MUNCH_HEIGHT    (VEL_Y * 4)
  556. #define EDGE_WIDTH      (CELL_WIDTH + GAP_WIDTH * 2)
  557. #define EDGE_HEIGHT     (CELL_HEIGHT + GAP_HEIGHT * 2)
  558. #define DIGIT_HEIGHT    (CELL_HEIGHT / 2)
  559. #define DIGIT_WIDTH     (CELL_WIDTH / 4)
  560. #define DECAY_WIDTH     (CELL_WIDTH / 2 * 3)
  561. #define DECAY_HEIGHT    (CELL_HEIGHT / 4 * 3)
  562. #define ROT_WIDTH       (CELL_WIDTH / 2 * 3)
  563. #define ROT_HEIGHT      (CELL_HEIGHT / 2)
  564. /*}}}*/
  565. #define BALL_WIDTH    6
  566. #define BALL_HEIGHT   6
  567. extern SPRITE sprites[SPRITES];
  568. extern APPLE_SIZE const apple_sizes[6];
  569. #define BOARDS 10
  570. extern BOARD const boards[BOARDS];
  571. extern char keystrokes[5];
  572. extern COORD const ball_hold[16];
  573. extern COORD const ball_throw[8];
  574. extern int const ball_dir[8];
  575. extern int const player_dies[8];
  576. extern char const *title_text[];
  577. #define SQUISH_SCORES 7
  578. extern int const squish_scores[SQUISH_SCORES];
  579. /*}}}*/
  580. /*{{{  prototypes*/
  581. /*{{{  apple*/
  582. extern APPLE *apple_search PROTOARGLIST((int, int, unsigned, unsigned, unsigned));
  583. extern int apple_stop PROTOARGLIST((MONSTER *, CELL *));
  584. extern void apple_under PROTOARGLIST((MONSTER *, CELL *));
  585. extern void move_apples PROTOARGLIST((void));
  586. extern APPLE *spawn_apple PROTOARGLIST((int, int, int, int));
  587. /*}}}*/
  588. /*{{{  create*/
  589. extern void create_resources PROTOARGLIST((int, char **));
  590. extern void create_xtra_monster PROTOARGLIST((int));
  591. extern void draw_extra_letter PROTOARGLIST((int));
  592. extern void release_resources PROTOARGLIST((void));
  593. /*}}}*/
  594. /*{{{  demo*/
  595. extern int demo_mode PROTOARGLIST((void));
  596. extern void extra_life PROTOARGLIST((void));
  597. extern void show_history PROTOARGLIST((void));
  598. /*}}}*/
  599. /*{{{  draw*/
  600. extern void add_background PROTOARGLIST((int, int, int, int));
  601. extern void bounding_box PROTOARGLIST((int, int, unsigned, unsigned));
  602. extern void draw_center PROTOARGLIST((int));
  603. extern void draw_extra PROTOARGLIST((void));
  604. extern void new_board PROTOARGLIST((void));
  605. extern void refresh_window PROTOARGLIST((void));
  606. extern void show_updates PROTOARGLIST((void));
  607. extern void text_size PROTOARGLIST((char const *, unsigned, TEXT *));
  608. extern void zoom_board PROTOARGLIST((void));
  609. /*}}}*/
  610. /*{{{  monster*/
  611. extern MONSTER *extra_escape PROTOARGLIST((void));
  612. extern void fall_monsters PROTOARGLIST((void));
  613. extern void move_monsters PROTOARGLIST((void));
  614. extern void new_xtra PROTOARGLIST((void));
  615. extern MONSTER *spawn_monster PROTOARGLIST((int, int, int, int, int, int, int));
  616. /*}}}*/
  617. /*{{{  move*/
  618. extern unsigned choose_direction PROTOARGLIST((unsigned));
  619. extern CELL *drop_apple PROTOARGLIST((APPLE *, CELL *));
  620. extern CELL *move_movable PROTOARGLIST((MONSTER *, CELL *));
  621. extern CELL *move_muncher PROTOARGLIST((MONSTER *));
  622. extern void munch_hole PROTOARGLIST((CELL *, int, int));
  623. extern void new_face PROTOARGLIST((MONSTER *));
  624. extern int valid_directions PROTOARGLIST((MONSTER *, CELL *));
  625. /*}}}*/
  626. /*{{{  player*/
  627. extern void bounce_ball PROTOARGLIST((void));
  628. extern void move_player PROTOARGLIST((void));
  629. /*}}}*/
  630. /*{{{  timer*/
  631. extern void timer_close PROTOARGLIST((void));
  632. extern void timer_open PROTOARGLIST((void));
  633. extern void timer_start PROTOARGLIST((unsigned long));
  634. extern void timer_stop PROTOARGLIST((void));
  635. extern void timer_wait PROTOARGLIST((void));
  636. /*}}}*/
  637. /*{{{  xmris*/
  638. extern void add_score PROTOARGLIST((int, int, int));
  639. extern void calc_distances PROTOARGLIST((void));
  640. extern void fatal_error PROTOARGLIST((char const *, ...));
  641. extern int itoa PROTOARGLIST((char *, int, int));
  642. extern int main PROTOARGLIST((int, char **));
  643. extern int process_xevents PROTOARGLIST((int));
  644. #if defined(sco)
  645. extern long random PROTOARGLIST((void));
  646. #else
  647. extern unsigned random PROTOARGLIST((void));
  648. #endif
  649. /*}}}*/
  650. /*}}}*/
  651.